/**
 * @program: clms-second
 * @description: 微信支付的工具类
 * @author: mitu_echo
 * @create: 2021-08-07 11:41
 **/

package com.second.weixinpay.pojo.util;

import com.github.wxpay.sdk.WXPayUtil;
import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

public class WeiXinPayUtil {

    /**
     * 返回生成的微信支付的二维码
     * @param orderNo 订单号
     * @return
     */
    public static String getCode(String orderNo) {

        try {
            // 封装数据请求微信地址的参数
            Map<String, String> m = new HashMap<>();
            m.put("appid", WeixinConfig.APPID);
            m.put("mch_id", WeixinConfig.MCH_ID);
            m.put("nonce_str", WXPayUtil.generateNonceStr());
            // 标题
            m.put("body", "迷途的黑店");
            // 订单号
            m.put("out_trade_no", orderNo);
            // 支付金额，固定写死 是0.01，因为微信是真实付款
            m.put("total_fee", new BigDecimal("0.01").multiply(new BigDecimal("100")).longValue() + "");
            // 部署服务器的地址。
            m.put("spbill_create_ip", "192.168.0.100");
            // 必填项，微信支付成功后的通知方法
            m.put("notify_url","http://192.168.0.100:8084/notifyUrl");
            // 支付类型   native 扫码支付
            m.put("trade_type", "NATIVE");

            // 发送请求到微信的地址https://api.mch.weixin.qq.com/pay/unifiedorder
            // httpclient:模拟浏览器发送请求。 get  post  (1)引入httpclient的依赖
            HttpClient httpClient = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
            // 因为微信接口需要参数的格式必须xml格式。
            httpClient.setXmlParam(WXPayUtil.generateSignedXml(m, WeixinConfig.API_KEY));
            // 是否支持https协议
            httpClient.setHttps(true);
            // 发送请求 回车键
            httpClient.post();

            // 得到微信响应的结果。
            // 得到结果
            String content = httpClient.getContent();
            // 把xml格式的字符串转化为map对象
            Map<String, String> resultMap = WXPayUtil.xmlToMap(content);
            System.out.println(resultMap);
            // 判断是否成功，成功之后获取二维码，返回
            if(resultMap.get("result_code").equals("SUCCESS")) {
                return resultMap.get("code_url");
            }else{
                return null;
            }
        }catch (Exception e){
            return null;
        }
    }

    public static Boolean getPayStatus(String orderNo) {

        try {
            //https://api.mch.weixin.qq.com/pay/orderquery
            String url = "https://api.mch.weixin.qq.com/pay/orderquery";
            //封装请求的参数
            Map<String, String> map = new HashMap<>();
            map.put("appid",WeixinConfig.APPID);
            map.put("mch_id", WeixinConfig.MCH_ID);
            map.put("out_trade_no", orderNo);
            map.put("nonce_str", WXPayUtil.generateNonceStr());
            //模拟浏览器发送请求
            HttpClient httpClient = new HttpClient(url);
            httpClient.setXmlParam(WXPayUtil.generateSignedXml(map,WeixinConfig.API_KEY));
            httpClient.setHttps(true);
            httpClient.post();
            //得到响应的结果
            String xml = httpClient.getContent();
            System.out.println(xml);
            Map<String,String> resultMap=WXPayUtil.xmlToMap(xml);
            // 如果相同表示支付成功
            if (StringUtils.equals(resultMap.get("trade_state"),"SUCCESS")) {
                return true;
            } else {
                return false;
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
}
